package com.wn.sk.gateway.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @author yellow Docter
 * @date 2022 -09-07
 * @desc
 *  过滤器
 *  01实现过滤器的步骤:
 *      1.1 创建一个类型 实现  GlobalFilter接口(全局过滤器)
 *      1.2 局部过滤器 GatewayFilterFactory里面的过滤器 (只能对过滤器的路由有作用)
 *
 *  02 重写 filter 方法
 *
 *      2.1 ServerWebExchange 服务器交换机 可以封装了 请求、响应、路径等内容
 *       String path = exchange.getRequest().getURI().getPath();
 *     2.2 放行
 *        chain.filter(exchange)
 *
 *  03 过滤器的执行的顺序
 *     3.1 Ordered 这个接口的返回值决定 过滤器的优先级，返回结果数据越小 优先级越高
 *         如果返回结果的值一样,通过过滤器的名称字符串排序
 *
 *     3.2  全局过滤器 和 局部过滤器的执行的顺序
 *           网关过滤器与全局过滤器的order值一样，全局过滤器执行优先级更高
 *          原因：网关过滤器与全局过滤器最终会合并为一个过滤器集合，形成过滤器执行链
 *              List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
 *  		    combined.addAll(gatewayFilters);
 *
 */
@Component
@Slf4j
public class AuthFilter2 implements GlobalFilter, Ordered {

    //ServerWebExchange 服务器交换机 这里封装了 请求、响应、路径等内容
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        //拿到请求的路劲
        String path = exchange.getRequest().getURI().getPath();
        log.info("我的请求路径：{}",path);

        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}
